package peace.htmllooker.node
{
import flash.display.DisplayObject;
import flash.text.StyleSheet;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;

import peace.htmllooker.Node;
/**
 * Узел, пожирающий все, не поддерживаемое специально. <br>
 * На основе  flash.text.TextField
 */
public class Text extends Node
{
	/**
	 * минимальная ширина текстового узла 
	 */
	protected static const MIN_WIDTH:Number = 30;
	/**
	 * минимальная высота текстового узла 
	 */
	protected static const MIN_HEIGHT:Number = 20;
	/**
	 * 
	 */	
	protected var t:TextField = new TextField();
	/**
	 * 
	 * @param xml
	 * @param css
	 * 
	 */	
	public function Text(xml:XML, css:StyleSheet)
	{
		super(xml, css);
		
//		t.border = true;
	}
	/**
	 * 
	 * @param xml
	 * @param css
	 * 
	 */	
	override protected function init(xml:XML, css:StyleSheet):void
	{
		// читаем свойства

		// создаем поле
		t.styleSheet = css;
		
		t.autoSize = TextFieldAutoSize.LEFT;
		t.selectable = false;
		t.mouseWheelEnabled = false;
		t.multiline = true;
		t.wordWrap = true;
		t.condenseWhite = true;
		
		t.htmlText = preprocess(xml).toXMLString();
		
		// меряем реальный разер текста
		t.width = 2000;
		preferredHeight = t.textHeight + shellHeight + 4;
		preferredWidth = t.textWidth + shellWidth + 5;
		// отскейливаем обратно
		t.width = MIN_WIDTH;
		minWidth = MIN_WIDTH + shellWidth;
		t.height; // наебываем АВМ: не верно считает высоту текста без этой штуки
		minHeight = Math.max(t.height, MIN_HEIGHT) + shellHeight; 
		
		addChild(t);

		super.init(xml, css);
	}
	/**
	 * 
	 * @return 
	 * 
	 */	
	override public function get content():DisplayObject
	{
		return t;
	}
	/**
	 * 
	 * @param value
	 * 
	 */	
	override public function set width(value:Number):void
	{
		// не делаем шире реального размера текста
		// чтобы нормально работало выравнивание в Box
		if (value > preferredWidth) value = preferredWidth;
		
		if (width != value)
		{
			var old:Number = t.height;
			
			super.width = value;
			
			minHeight = Math.max(t.height, MIN_HEIGHT) + shellHeight; 
			
			arrange();
			
			if (t.height != old)
			{
				parentBox.childSizeChanged(this);
			}
			
		}	
	}
	/**
	 *  
	 * @param value
	 * 
	 */	
	override public function set height(value:Number):void
	{
		// empty
	}
	/**
	 * Обработка xml перед отображением
	 * 
	 * @param xml
	 * @return 
	 * 
	 */	
	protected function preprocess (xml:XML):XML
	{
		// стираем <br> в начале и конце
		// если только весь html не состоит из BR, тогда только в начале
		var children:XMLList = xml.*;
		
		// первый стираем в любом случае
		if (children[0] == <br/>) delete children[0];
		
		var x:XML;
		for each (x in children)
		{
			if (x != <br/>)
			{
				// если один из детей не BR, стираем последний (если есть)
				if (children[children.length()-1] == <br/>) delete children[children.length()-1];
				break;			
			}
		}

		return xml; 
	}
	
	
	
}
}